#ifndef G3_STRING_H
#define G3_STRING_H

#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <sstream>
#include <string>
#include <vector>

#include "types.h"

#define G3_BOOLEAN(a)				((a) ? "Yes" : "No")

namespace G3 {

using std::string;
using std::vector;
using std::istringstream;
using std::ostringstream;

class STR_REPLACEMENT {
	public:
		STR_REPLACEMENT ();

		string Old;
		string New;

		dword Start;
		dword Length;

		void *UserData;

		STR_REPLACEMENT& operator=(const STR_REPLACEMENT &str);
		bool operator<(const STR_REPLACEMENT &str) const;
		bool operator==(const STR_REPLACEMENT &str) const;
};

class TOKENLIST {
    public:
        vector<string> Tokens;
		vector<string> Delims;

        string operator[](const int &id) const;
		TOKENLIST& operator=(const TOKENLIST &tokl);

		int size () const;

        void clear ();
};

//==============================================================================
// Removes trailing whitespaces and tabs from str
//==============================================================================
string TrimString (string str);

//==============================================================================
// Removes trailing delimiters from Str
//==============================================================================
string TrimDelimiters (const string &Str, const string &Delims);

//==============================================================================
// Copies until a certain delimiter occurs
//==============================================================================
string CopyUntilDelim (const string &str, const string &delim);

//==============================================================================
// Copies until one of the characters occur
//==============================================================================
string CopyUntilDelims (const string &str, const string &delims);

//==============================================================================
// Starts copying the characters after one of the delimiters have occurred
//==============================================================================
string CopyAfterDelims (const string &str, const string &delims);

//==============================================================================
// Tokenizes an STL string
//==============================================================================
TOKENLIST Tokenize (const string &str, const string &delimiters);

//==============================================================================
// Finds the number of substring occurrences in a string
//==============================================================================
int CountSubstrings (const string &str, const string &substr);

//==============================================================================
// Finds the number of substring occurrences in a string and erases them
//==============================================================================
int CountAndEraseSubstrings (string &str, const string &substr);

//==============================================================================
// Indents the string to a given depth
//==============================================================================
std::string IndentStr (const std::string &str, const uint &depth, const char c = ' ');

//==============================================================================
// Returns true if the string is a decimal or float
//==============================================================================
bool IsNumber (string str);

//==============================================================================
// Returns true if the string is a decimal
//==============================================================================
bool IsDecimal (string str);

//==============================================================================
// Returns true if the string contains text characters
//==============================================================================
bool IsText (string str);

//==============================================================================
// These make string -> long, float, double conversions
//==============================================================================
long StrToInteger (string str);
float StrToFloat (string str);
double StrToDouble (string str);

//==============================================================================
// These make long, float, double -> string conversions
//==============================================================================
string IntegerToStr (long i);
string FloatToStr (float f);
string DoubleToStr (double d);

}

#endif //G3_STRING_H
